package com.fulihui.wgj.datastatis.dal.repository;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * 基类
 * 根据泛型类型注入对象 提供基础的DAO层方法
 *
 * @author wang_wx
 * @date 2018-06-20
 */
public abstract class BaseRepository<T> {

    /**
     * 根据泛型类型注入对象
     */
    @Autowired
    private Mapper<T> mapper;

    public Mapper<T> getMyMapper() {
        return mapper;
    }

    /**
     * 根据主键查询单个
     *
     * @param id
     * @return
     */
    public T queryById(Object id) {
        return this.mapper.selectByPrimaryKey(id);
    }

    /**
     * 查询所有数据
     *
     * @return
     */
    public List<T> queryAll() {
        return this.mapper.select(null);
    }

    /**
     * 根据条件查询数量
     *
     * @param t
     * @return
     */
    public Integer countByWhere(T t) {
        return this.mapper.selectCount(t);
    }

    /**
     * 根据条件查询数量
     *
     * @param example
     * @return
     */
    public Integer countByExample(Example example) {
        return this.mapper.selectCountByExample(example);
    }

    /**
     * 根据条件查询集合数据
     *
     * @param t
     * @return
     */
    public List<T> queryByWhere(T t) {
        return this.mapper.select(t);
    }

    /**
     * 根据条件查询集合数据
     *
     * @param example
     * @return
     */
    public List<T> queryByExample(Example example) {
        return this.mapper.selectByExample(example);
    }

    /**
     * 根据条件查询一条数据
     *
     * @param t
     * @return
     */
    public T queryOne(T t) {
        return this.mapper.selectOne(t);
    }

    /**
     * 分页查询数据
     *
     * @param t    泛型
     * @param page 页码
     * @param rows 每页显示数量
     * @return 对Page结果进行包装
     */
    public PageInfo<T> queryPageListByWhere(T t, Integer page, Integer rows) {
        if (null == page) {
            page = 1;
        }
        if (null == rows) {
            rows = 20;
        }
        // 设置分页参数
        PageHelper.startPage(page, rows, true);
        List<T> list = this.queryByWhere(t);
        return new PageInfo<>(list);
    }

    /**
     * 自定义查询条件，分页查询
     *
     * @param example
     * @param page
     * @param rows
     * @return
     */
    public PageInfo<T> queryPageListByExample(Example example, Integer page, Integer rows) {
        if (null == page) {
            page = 1;
        }
        if (null == rows) {
            rows = 20;
        }
        // 设置分页参数
        PageHelper.startPage(page, rows, true);
        // 查询数据
        List<T> list = this.mapper.selectByExample(example);
        return new PageInfo<>(list);
    }


    /**
     * 新增数据
     *
     * @param t
     */
    public Integer save(T t) {
        return this.mapper.insert(t);
    }

    /**
     * 新增数据不为null的
     *
     * @param t
     */
    public Integer saveSelective(T t) {
        return this.mapper.insertSelective(t);
    }

    /**
     * 更新数据
     *
     * @param t
     */
    public Integer update(T t) {
        return this.mapper.updateByPrimaryKey(t);
    }

    /**
     * 更新数据
     *
     * @param t
     * @param example
     */
    public Integer update(T t, Example example) {
        return this.mapper.updateByExample(t, example);
    }

    /**
     * 更新数据 使用不为null的
     *
     * @param t
     */
    public Integer updateSelective(T t) {
        return this.mapper.updateByPrimaryKeySelective(t);
    }

    /**
     * 更新数据 使用不为null的
     *
     * @param t
     * @param example
     */
    public Integer updateByExampleSelective(T t, Example example) {
        return this.mapper.updateByExampleSelective(t, example);
    }

    /**
     * 根据Id删除
     *
     * @param id
     * @return
     */
    public Integer deleteById(Object id) {
        return this.mapper.deleteByPrimaryKey(id);
    }

    /**
     * 批量删除
     *
     * @param clazz
     * @param property
     * @param ids
     * @return
     */
    public Integer deleteByIds(Class<T> clazz, String property, List<Object> ids) {
        Example example = new Example(clazz);
        example.createCriteria().andIn(property, ids);
        return this.mapper.deleteByExample(example);
    }
}
